﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows;
using System.Runtime.InteropServices;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Shell;
using UCL.Powersource.Views;
using System.Windows.Controls;
using PowersourceUIToolkit;
using UCL.Powersource.ViewModels;
using System.ComponentModel.Composition;

namespace UCL.Powersource
{
    /// <summary>
    /// This class implements the tool window exposed by this package and hosts a user control.
    ///
    /// In Visual Studio tool windows are composed of a frame (implemented by the shell) and a pane, 
    /// usually implemented by the package implementer.
    ///
    /// This class derives from the ToolWindowPane class provided from the MPF in order to use its 
    /// implementation of the IVsUIElementPane interface.
    /// </summary>
    [Guid("d9c05257-9eac-4996-922e-1ec94867fc3a")]
    
    public class PowersourceToolWindow : ToolWindowPane
    {


        private IUIManager UIManager;
        private PowersourceMainViewModel PowersourceMainViewModel;
        private ILog Log = LogManager.GetLog(typeof(PowersourceToolWindow));
        private IViewConductor ToolWindowPaneConductor;

        /// <summary>
        /// Standard constructor for the tool window.
        /// </summary>
        public PowersourceToolWindow() :
            base(null)
        {
            Log.Debug("Constructing PowersourceToolWindow");
            // Set the window title reading itForFE from the resources.
            this.Caption = Resources.ToolWindowTitle;
            // Set the image that will appear on the tab of the window frame
            // when docked with an other window
            // The resource ID correspond to the one defined in the resx file
            // while the Index is the offset in the bitmap strip. Each image in
            // the strip being 16x16.
            this.BitmapResourceID = 301;
            this.BitmapIndex = 1;
            
            base.Content = new TextBlock() { Text = "Not initialized" }; //new UserControl();//new PowersourceMainView();
        }

        protected override void Initialize()
        {
            Log.DebugMethod("Begin");
            base.Initialize();
            UIManager = (IUIManager)IoC.GetInstance(typeof(IUIManager), null);
            PowersourceMainViewModel = ViewModelLocator.GetViewModel<PowersourceMainViewModel>();
            PowersourceMainViewModel.Initialize();
            Log.DebugMethod("Activating ToolWindowPaneConductor");
            
            ToolWindowPaneConductor = UIManager.GetViewConductor(this);
            Log.TraceMethod("Activating {0} in {1}", PowersourceMainViewModel, ToolWindowPaneConductor);
            UIManager.ActivateViewModelInConductor(PowersourceMainViewModel, ToolWindowPaneConductor);
            
            // Code reimplemented - ToolWindowPaneConductor is now responsible for call and will be destroyed on dispose
            // This is the user control hosted by the tool window; Note that, even if this class implements IDisposable,
            // we are not calling Dispose on this object. This is because ToolWindowPane calls Dispose on 
            // the object returned by the Content property.
            //base.Content = UIManager.GetOrCreateControl(PowersourceMainViewModel);
            Log.DebugMethod("End");
        }

        protected override void Dispose(bool disposing)
        {
            Log.TraceMethod();
            if (ToolWindowPaneConductor != null)
            {
                ToolWindowPaneConductor.Dispose();
            }
            base.Dispose(disposing);
        }

    }
}
